package com.itxx.xmlDemo;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class XmlDemo {
    public static void main(String[] args) throws DocumentException {
        /*
          xml(Extendsible Markup language)    xml的出现是为了替换Html
            是一种 可扩展的标记语言
            标记语言: 通过标签来描述数据的一门语言(标签->元素)
            可扩展: 标签名可自定义
            作用:
            1.作为配置文件
            2.数据的保存方式
        */

        /*
          标签的规则
              标签由一对尖括号和合法标识符组成 <Student>
              标签必须成对出现   <Student> </Student>
              特殊的标签可以不成对.但必须有结束标记 <address/>
              标签中可以定义属性,属性和标签名空格隔开属性值必须用引号隔开<Student id="1></Student>
              标签使用必须正常嵌套

        */


        /*
            语法规则:
                1.后缀名为 .xml
                2.xml文件第一行必须是文档声明
                    <?xml version="1.0" encoding="utf-8"? standalone="yes">
                    version 必须存在
                    encoding 不是必须编码格式
                    standalone: 是否依赖其他xml文件
                3.根标签有且只有一个
                4.xml文件中可以定义注释信息
                5.xml文件可以存在特殊符号

                6.xml在CDATA区
                    <[CDTAT[具体内容]]>
        */

        /*
            Dom解析思想 (可以读取  也可以修改)
                文档对象模型  就是把文件中的各个组成部分看成每个对象\
                Document(对象) -> Students(根标签) -> studnet(子标签)
                1.DOcument独享:整个xml对象
                2.Element对象:所有标签(根和子)
                3.Attribute对象:所有属性
                4.Text对象:所有文本内容         234还有个共同父类对象 Node节点
            SAX解析思想  (只能读取  不能修改)
                一行一行读取 一行一行解析  比较省内存(速度慢相对于Dom)
                JAXP[java提供的] DOm4J  Jsoup[爬虫用的比较多]


        */
        //1.获取解析器对象
        SAXReader saxReader = new SAXReader();
        //2.利用解析器xml加载到内存,返回Document对象 read()
        Document document = saxReader.read(new File("day17\\xml\\student.xml"));
        //3.获取Element对象  getrootElement()
        Element rootElement = document.getRootElement();
        //4.获取子标签  elements() 获取所有子标签 返回一个集合
        // elements(String name) 获取指定名字的字标签
        List<Element> elements = rootElement.elements("student");
        //5.遍历集合获取每一个element
        for (Element element : elements) {
            //5.attribut获取属性 +6.getValue获取属性值
            /*Attribute nameelement = element.attribute("name");
            String name = nameelement.getValue();*/
            String id = element.attributeValue("id");
            String name = element.elementText("name");
            String age = element.elementText("age");
            System.out.println(id + " " + name + " " + age);

        }


    }
}
